import pymysql
from flask import g
from flask import request, jsonify
from flask import session,current_app,render_template

from info import constants
from info.models import User, News, Category
from info.utlis.response_code import RET
from . import index_bp
pymysql.install_as_MySQLdb()
from info.utlis.common import login_user_data

# 127.0.0.1:5000/new_list GET
@index_bp.route('/news_list')
def get_news_list():
    '''获取首页新闻列表数据'''
    params_dict = request.args
    cid = params_dict.get('cid')
    page = params_dict.get('page', 1)
    per_page = params_dict.get('per_page', constants.HOME_PAGE_MAX_NEWS)

#     非空判断
    if not all([cid, page, per_page]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不足")
    # 数据类型判断
    try:
        cid = int(cid)
        page = int(page)
        per_page = int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="数据类型错误")

#     逻辑处理
    filters = []
    # 因为在cid＝１的情况下，是最新的新闻，没有对应的新闻
    if cid != 1:
        # == 数据库底层已经实现了 == 函数返回的不是bool值而是查询条件
        # 每种新闻的分类，(自关联的表)理解为新闻的category_id == 新闻的id，满足这样条件的的新闻就添加到filters中
        filters.append(News.category_id == cid)
    try:
        # paginate(erro_out = False(错误输出) )分页处理　order_by(排序)　
        # *filters（里面的信息市新闻列表），因此需要使用＊filters解包
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()) \
            .paginate(page, per_page, False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询首页新闻列表数据异常")

    # 获取当前页码所有的数据
    items = paginate.items
    current_page = paginate.page
    total_page = paginate.pages
    news_dict_list = []
    for news in items if items else []:
        # to_dict() 一个函数，调用该函数的话，会返回一个字典类型的数据
        # 将新闻对象转换成字典[{},{},{}]
        news_dict_list.append(news.to_dict())
        data = {
            "news": news.to_dict(),
            "newsList": news_dict_list,
            "current_page": current_page,
            "total_page": total_page
        }

#         返回值处理
    return jsonify(errno=RET.OK, errmsg="查询新闻列表数据成功", data=data)


# 使用蓝图
@index_bp.route('/')
@login_user_data
def hello_world():
    '''-------1.当用户登录成功后可以使用session对象获取里面的用户user_id -------'''
    # 1. 获取user_id
    user = g.user

    # -------2.查询新闻的点击排行数据 -------
    # 1.根据浏览量查询6条点击排行的新闻数据
    # [news1, news2,....] news属于News的对象
    try:
        news_model_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)
        # 切记不能返回return 否则首页都渲染不了啦，只需要返回一个None的数据即可

    # 2. 将模型列表转换成字典列表
    news_dict_list = []
    for news in news_model_list if news_model_list else []:
        # 获取到new对象调用to_dict方法将对象转换成字典，再添加到news_dict_list中
        news_dict_list.append(news.to_dict())



    # -------3.查询新闻的分类数据 -------
    categories = []
    try:
        # 这是一个装着６条数据的对象．info_category 取该数据库中的六条数据，转换成对象，再遍历成出来，再转换成数据
        categories = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
    # 模型列表转字典列表
    category_dict_list = []
    for category in categories if categories else []:
    # 将分类对象转换成字典对象添加到列表
        category_dict_list.append(category.to_dict())

    data = {
        "user_info": user.to_dict() if user else None,
        "newsClicksList": news_dict_list,
        'category_dict_list': category_dict_list
    }
    return render_template("index.html", data=data)


# 解决404的问题
@index_bp.route('/favicon.ico')
def favicon():
    return current_app.send_static_file("news/favicon.ico")
